package com.algorithm.liyc.practice;

import java.util.HashMap;
import java.util.Map;

/**
 * 两数之和
 * 给定一个整数数组 nums 和一个目标值 target，请你在该数组中找出和为目标值的那 两个 整数，并返回他们的数组下标。
 *
 *
 * ● 为什么会想到用哈希表
 * 首先我在强调一下 什么时候使用哈希法，当我们需要查询一个元素是否出现过，或者一个元素是否在集合里的时候，就要第一时间想到哈希法。
 * ● 哈希表为什么用map
 * HashMap底层实现为哈希表
 * ● 本题map是用来存什么的
 * map目的用来存放我们访问过的元素，因为遍历数组的时候，需要记录我们之前遍历过哪些元素和对应的下标，这样才能找到与当前元素相匹配的
 * ● map中的key和value用来存什么的
 * 那么判断元素是否出现，这个元素就要作为key，所以数组中的元素作为key，有key对应的就是value，value用来存下标。
 * @author Liyc
 * @date 2023/11/28 16:07
 **/

public class Solution18 {
    public int[] twoSum(int[] nums, int target) {
        int[] res = new int[2];
        if (nums == null || nums.length == 0) {
            return res;
        }
        Map<Integer, Integer> integerMap = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            // 遍历当前元素，并在map中寻找是否有匹配的key
            int temp = target - nums[i];
            if (integerMap.containsKey(temp)) {
                res[1] = i;
                res[0] = integerMap.get(temp);
                break;
            }
            // 如果没找到匹配对，就把访问过的元素和下标加入到map中
            integerMap.put(nums[i], i);
        }
        return res;
    }
}
